// Extensão dom para jProton.Set.
/**#@+ @extends dom */
set.extend(/** @lends jProton.Set.prototype */ {

  '@extension': {'dom': '0.3.0a'},

  /**
   * Retorna o valor da propriedade do primeiro elemento selecionado. Se a 
   * propriedade não existir, retorna undefined.   
   * 
   * @param  {String}   key   Nome da propiedade.
   * @return {Value}
   */

  /**
   * Altera o valor da proriedade de todos os elementos selecionados.
   * 
   * @param  {String}   key   Nome da propiedade.
   * @param  {Value}    val   Valor a ser definido.
   * @return {jProton.Set}
   */
  attr: function(key, val) {
    if (val) {
      // Processa $().attr(key, val)
      for(var i=0,e=this.e,ei;ei=e[i];i++)
        element.attr(ei, key, val);

      return this;
    } else
      // Processa $().attr(key)
      return element.attr(this.e[0], key);
  },

  /**
   * Retorna o valor da propriedade 'value' do primeiro elemento selecionado.
   * 
   * @return {Value}
   */

  /**
   * Altera valor à propriedade "value" de todos elementos selecionados. Se
   * o elemento em questão for do tipo "select options", a opção com o mesmo
   * valor será selecionada.  
   * 
   * ~~
   * // Seleciona a opção que possui valor 'op1' de todos elementos 'select'   
   * $('select').val('op1');
   * ~~
   * 
   * @param {String}  val  Valor a ser atrubuído a propriedade "value".
   * @return {jProton.Set}
   */

  /**
   * Marca ou seleciona elementos do tipo "select options", "checkbox" ou 
   * "radio button".
   * 
   * ~~
   * // Seleciona as opções 'Multiple2' e 'Multiple3' do select de id 'multiple'   
   * $('#multiple').val(['Multiple2', 'Multiple3']);
   *    
   * // Marca o checkbox de valor 'check2' e o radio button de valor 'radio1'
   * $('input').val(['check2', 'radio1']);
   * ~~
   *
   * @param {Array}   values   Array de Strings com os valores dos elementos
   *                           que serão marcados ou selecionados.
   *                        
   * @return {jProton.Set}
   */
  val: function(val) {
    if (val) {
      // Processa $().val(val)
      for(var i=0,e=this.e,ei;ei=e[i];i++)
        element.val(ei, val);

      return this;
    } else
      // Processa $().val()
      return element.val(this.e[0]);
  },

  /**
   * Retorna o conteúdo HTML do primeiro elemento selecionado.
   * 
   * @return {String}
   */

  /**
   * Aletar o conteúdo HTML de todos elementos selecionados.
   * 
   * @param {String}  val   Conteúdo HTML a ser atribuído.
   * @return {jProton.Set}
   */
  html: function(val) {
    if (val) {
      // Processa $().html(val)
      for(var i=0,e=this.e,ei;ei=e[i];i++)
        ei.innerHTML = val;

      return this;
    } else
      // Processa $().html()
      return this.e[0] ? this.e[0].innerHTML : undefined;
  },

  /**
   * Adiciona o conteúdo HTML no final do interior de todos elementos 
   * selecionados.
   * 
   * @param {String}  val   Conteúdo HTML a ser adicionado.
   * @return {jProton.Set}
   */
  append: function(val) {
    for(var i=0,e=this.e,ei;ei=e[i];i++)
      ei.innerHTML += val;

    return this;
  },

  /**
   * Adiciona o conteúdo HTML no início do interior de todos elementos 
   * selecionados.
   * 
   * @param {String}  val   Conteúdo HTML a ser adicionado.
   * @return {jProton.Set}
   */
  prepend: function(val) {
    for(var i=0,e=this.e,ei;ei=e[i];i++)
      ei.innerHTML = val + ei.innerHTML;

    return this;
  },

  /**
   * Retorna o conteúdo de texto do primeiro elemento selecionado.
   * 
   * @return {String}
   */

  /**
   * Altera o conteúdo de texto de todos os elementos selecionados.
   *
   * @param {String}  val  Conteúdo de texto a ser atribuído.
   * @return {jProton.Set}
   */
  text: function(val) {
    if (val) {
      // Processa $().text(val)
      for(var i=0,e=this.e,ei;ei=e[i];i++)
        element.text(ei, val);

      return this;
    } else
      // Processa $().text()
      return element.text(this.e[0]);
  }

  /**#@-*/
});
